﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Djs.Neuronic.Medium;

namespace Djs.Neuronic.Brain
{
    #region CellCls : jedna položková databázová třída, jde o potomka třídy ItemCls, který obsahuje jednu sadu položek.
    /// <summary>
    /// CellCls : jedna položková databázová třída, jde o potomka třídy ItemCls, který obsahuje jednu sadu položek.
    /// Je základní třídou pro potomky typu Buňka.
    /// Neuron má ID, svůj typ, a sadu vztahů (synapse).
    /// Všechny další prvky (kromě synapsí) odvozují svůj původ od neuronu.
    /// Neuron sám je abstraktní, protože neurčuje svoji tabulku (to musí určit potomek).
    /// </summary>
    public abstract class CellCls : RecordCls
    {
        public int CellType { get { return this._CellType; } set { this._CellType = value; SetDirty(); } }
        private int _CellType;
        protected override void Fill(RecordFillInfo data)
        {
            if (data.ContainDataNotNull("cell_type"))
                this._CellType = (int)data.Get("cell_type");
        }
        #region Synapse
        public IEnumerable<SynapsisCls> Synapsis { get { return this._GetSynapsis(); } }

        private List<SynapsisCls> _GetSynapsis()
        {
            if (this._Synapsis == null)
                this._Synapsis = new List<SynapsisCls>();
            return this._Synapsis;
        }
        private List<SynapsisCls> _Synapsis;
        #endregion
    }    
    #endregion
    /// <summary>
    /// Synapse : jde o vlákno natažené mezi dvěma buňkami.
    /// Na rozdíl od neurální synapse, která je výběžkem (fyzickou součástí) neuronu / smyslové buňky, a dotýká se jiné synapse, která je opět výběžkem druhé buňky.
    /// </summary>
    public class SynapsisCls
    {
        public CellCls SourceCell;
        public CellCls SynapsisCell;
        public Int16 SynapsisWeight;
        public CellCls TargetCell;
        private int _SourceId;
        private int _SynapsisId;
        private short _SynapsisWeight;
        private int _TargetId;
    }
    

}
